DROP DATABASE IF EXISTS frigg;
CREATE DATABASE frigg;
\c frigg
CREATE LANGUAGE plpgsql;
ALTER DATABASE frigg SET datestyle = SQL, DMY;

CREATE TABLE usuarios (
login varchar(20) not null,
senha varchar(255) not null,
constraint pk_usuarios primary key (login)
);

CREATE TABLE papeis (
codigo integer not null,
descricao varchar(20) not null,
constraint pk_papeis primary key (codigo)
);

CREATE TABLE permissoes (
codigo integer not null,
descricao varchar(50) not null,
valor integer not null default 0,
constraint pk_permissoes primary key (codigo)
);

CREATE TABLE objetos (
codigo integer not null,
valor varchar(20) not null,
descricao varchar(80),
constraint pk_objetos primary key (codigo)
);

CREATE TABLE papeis_usuario (
login varchar(20) not null,
cod_papel integer not null,
constraint fk_usuarios foreign key (login) references usuarios ON DELETE CASCADE,
constraint fk_papeis foreign key (cod_papel) references papeis,
constraint pk_papeis_usuario primary key (login, cod_papel)
);

CREATE TABLE permissoes_papel (
cod_papel integer not null,
cod_objeto integer not null,
cod_permissao integer not null,
constraint fk_papeis_permissoes foreign key (cod_papel) references papeis ON DELETE CASCADE,
constraint fk_objetos foreign key (cod_objeto) references objetos,
constraint fk_permissoes foreign key (cod_permissao) references permissoes,
constraint pk_permissoes_papel primary key (cod_papel, cod_objeto)
);

CREATE TABLE preferencias (
nome varchar(30) not null,
valor varchar(255),
descricao varchar(150),
constraint pk_preferencias primary key (nome)
);
INSERT INTO preferencias (nome, valor, descricao) VALUES ('ERRO_CAMPOS_NECESSARIOS', 'Preencha corretamente os campos do formulário.', 'Mensagem exibida quando algum campo obrigatório não foi preenchido em um formulário.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('LOGIN_INCORRETO', 'Não foi possível fazer o login com os dados fornecidos.', 'Mensagem exibida quando não é possível realizar o login com o usuário e senha fornecidos.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('NENHUM_REGISTRO_ENCONTRADO', 'Nenhum registro foi encontrado com os filtros aplicados.', 'Mensagem exibida quando uma busca não retorna nenhum resultado.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTRO_EDITADO_SUCESSO', 'Registro editado com sucesso.', 'Mensagem exibida ao editar um registro.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTRO_INSERIDO_SUCESSO', 'Registro inserido com sucesso.', 'Mensagem exibida ao inserir um registro.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTROS_EXCLUIDOS_SUCESSO', 'Registro(s) excluído(s) com sucesso.', 'Mensagem exibida ao excluir um ou mais registros.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTRO_INSERIDO_ERRO', 'Não foi possível inserir o registro. <br>Contate o administrador do sistema.', 'Mensagem exibida quando ocorre algum erro ao inserir um registro.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTRO_EDITADO_ERRO', 'Não foi possível editar o registro. <br>Contate o administrador do sistema.', 'Mensagem exibida quando ocorre algum erro ao atualizar um registro.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('REGISTROS_EXCLUIDOS_ERRO', 'Não foi possível excluir o(s) registro(s). <br>Contate o administrador do sistema.', 'Mensagem exibida quando ocorre um erro ao excluir algum registro.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('SEM_PERMISSAO', 'Você não tem permissão para acessar esta área.<br>Contate o administrador do sistema.', 'Mensagem exibida quando um usuário tenta acessar uma área em que ele não tem permissão de acesso.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('SENHA_ALTERADA_SUCESSO', 'Senha alterada com sucesso.', 'Mensagem exibida ao trocar a senha do usuário.');
INSERT INTO preferencias (nome, valor, descricao) VALUES ('SENHA_ALTERADA_ERRO', 'Ocorreu um erro ao tentar alterar a senha.', 'Mensagem exibida ao ocorrer algum erro ao trocar a senha do usuário.');

INSERT INTO permissoes VALUES (1, 'Acesso', 0);
INSERT INTO permissoes VALUES (2, 'Consulta', 1);
INSERT INTO permissoes VALUES (3, 'Edição', 2);
INSERT INTO permissoes VALUES (4, 'Inserção', 2);
INSERT INTO permissoes VALUES (5, 'Exclusão', 2);
INSERT INTO permissoes VALUES (6, 'Administrador', 3);

INSERT INTO usuarios VALUES ('admin', md5('admin'));

INSERT INTO papeis VALUES (1, 'Administrador');

INSERT INTO objetos VALUES (1, 'conexao', 'Alterar configurações da conexão com banco de dados');
INSERT INTO objetos VALUES (2, 'usuarios', 'Interface de gerenciamento de usuários');
INSERT INTO objetos VALUES (3, 'papeis', 'Interface de gerenciamento de papéis do usuário');
INSERT INTO objetos VALUES (4, 'preferencias', 'Interface de gerenciamento das preferências do sistema');

INSERT INTO papeis_usuario VALUES ('admin', 1);

INSERT INTO permissoes_papel VALUES (1, 1, 6);
INSERT INTO permissoes_papel VALUES (1, 2, 6);
INSERT INTO permissoes_papel VALUES (1, 3, 6);
INSERT INTO permissoes_papel VALUES (1, 4, 6);
